﻿using System;
using System.Collections.Generic;
using System.Web.UI.WebControls;
using MIAP.Entidades;
using MIAP.Negocio;
using MIAPWEB.Common;

namespace MIAPWEB.Forms
{
    public partial class ConsultaCargaEjecucion : PageBase
    {
        #region Campos

        /// <summary>
        /// Clase de negocio para las operaciones de comunes negocio.
        /// </summary>
        private ComunesNegocio comunesNegocio;

        /// <summary>
        /// Clase de negocio para las operaciones de consultaCargaEjecucionProyecto.
        /// </summary>
        private ConsultaCargasEjecucionNegocio consultaCargasEjecucionNegocio;

        /// <summary>
        /// Clase de negocio para las operaciones de SolicitudRecarga de archivos.
        /// </summary>
        private SolicitudRecargaNegocio solicitudRecargaNegocio;

        #endregion

        #region Propiedades

        /// <summary>
        ///  Obtiene o establece los filtros para la búsqueda.
        /// </summary>
        public ConsultaCargaEjecucionInfo ConsultaCargaFilters
        {
            get
            {
                return (ConsultaCargaEjecucionInfo)this.ViewState["ConsultaCargaFilters"];
            }

            set
            {
                this.ViewState["ConsultaCargaFilters"] = value;
            }
        }

        /// <summary>
        ///  Obtiene o establece la lista de Ejecuciones.
        /// </summary>
        private List<ConsultaCargaEjecucionInfo> DataSourceEjecucion
        {
            get
            {
                if (this.ViewState["DataSourceEjecucion"] == null)
                {
                    this.ViewState["DataSourceEjecucion"] = new List<ConsultaCargaEjecucionInfo>();
                }

                return this.ViewState["DataSourceEjecucion"] as List<ConsultaCargaEjecucionInfo>;
            }

            set
            {
                this.ViewState["DataSourceEjecucion"] = value;
            }
        }
        #endregion

        #region Constructor

        public ConsultaCargaEjecucion()
        {
            this.comunesNegocio = new ComunesNegocio();            
            this.consultaCargasEjecucionNegocio = new ConsultaCargasEjecucionNegocio();
            this.solicitudRecargaNegocio = new SolicitudRecargaNegocio();
        }

        #endregion

        #region Eventos

        /// <summary>
        /// Evento que se ejecuta al cargar la página.
        /// </summary>
        /// <param name="sender">Objeto que invoca al evento.</param>
        /// <param name="e">Argumentos del evento.</param>
        protected void Page_Load(object sender, EventArgs e)
        {
            this.grdProcesos.PageSize = Convert.ToInt32(new ConfiguracionNegocio().GetNumeroPaginasGrid().Descripcion);
            if (!this.IsPostBack)
            {
                this.ConsultaCargaFilters = new ConsultaCargaEjecucionInfo();

                this.GetProyectos();
                this.GetArchivosByProyecto(-1);
                this.GetUsuarios();
                this.GetMeses();
                this.GetAños();
                this.GetTipoProceso();

                this.Search();
            }
        }

        /// <summary>
        /// Método ejecutado al dar click al botón buscar. Busca los archivos que tienen cargas o recargas, asi como los proyectos ejecutados.
        /// </summary>
        /// <param name="sender">Objeto que invoca el evento.</param>
        /// <param name="e">Argumentos del evento.</param>
        protected void btnBuscar_Click(object sender, EventArgs e)
        {
            this.GetFilters();
            this.Search();
        }

        /// <summary>
        /// Método ejecutado al dar click al botón salir. Redirecciona a la página principal.
        /// </summary>
        /// <param name="sender">Objeto que invoca el evento.</param>
        /// <param name="e">Argumentos del evento.</param>
        protected void btnSalir_Click(object sender, EventArgs e)
        {
            Response.Redirect(Common.AppUrls.Default);
        }

        /// <summary>
        /// Método ejecutado al modificar la selección del dropdownlist Proyectos. Obtiene los archivos relacionados con el proyecto seleccionado.
        /// </summary>
        /// <param name="sender">Objeto que invoca el evento.</param>
        /// <param name="e">Argumentos del evento.</param>
        protected void ddlProyecto_SelectedIndexChanged(object sender, EventArgs e)
        {
            DropDownList dropProyecto = (DropDownList)sender;

            int idProyecto = int.Parse(dropProyecto.SelectedValue);

            this.GetArchivosByProyecto(idProyecto);
        }

        /// <summary>
        /// Evento que se ejecuta cuando se cambia de página en el grid.
        /// </summary>
        /// <param name="sender">Objeto que invoca el evento.</param>
        /// <param name="e">Argumentos del evento.</param>
        protected void grdProcesos_OnPageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            this.grdProcesos.PageIndex = e.NewPageIndex;
            this.grdProcesos.DataSource = this.DataSourceEjecucion;
            this.grdProcesos.DataBind();
        }

        #endregion

        #region Métodos

        /// <summary>
        /// Obtiene todos los proyectos.
        /// </summary>
        public void GetProyectos()
        {
            this.ddlProyecto.DataSource = AppSessionManager.Instance.GetProyectosByPagina(AppUrls.EjecucionProyectos);
            this.ddlProyecto.DataBind();
            this.comunesNegocio.SetTodos(this.GetGlobalResourceObject("strings", "Todos").ToString(), this.ddlProyecto);            
        }

        /// <summary>
        /// Obtiene todos los archivos relacionados a un proyecto.
        /// </summary>
        /// <param name="idProyecto">Id de proyecto.</param>
        private void GetArchivosByProyecto(int idProyecto)
        {
            this.ddlArchivo.DataSource = this.solicitudRecargaNegocio.GetArchivosByUsuarioProyecto(idProyecto, null);
            this.ddlArchivo.DataBind();
            this.comunesNegocio.SetTodos(this.GetGlobalResourceObject("strings", "Todos").ToString(), this.ddlArchivo);   
        }

        /// <summary>
        /// Obtiene todos los usuarios del sistema.
        /// </summary>
        private void GetUsuarios()
        {
            this.ddlUsuario.DataSource = this.consultaCargasEjecucionNegocio.GetUsuarios();
            this.ddlUsuario.DataBind();
            this.comunesNegocio.SetTodos(this.GetGlobalResourceObject("strings", "Todos").ToString(), this.ddlUsuario);   
        }

        /// <summary>
        /// Obtiene los meses.
        /// </summary>
        private void GetMeses()
        {
            this.ddlMes.DataSource = this.comunesNegocio.GetMeses();
            this.ddlMes.DataBind();
            this.comunesNegocio.SetTodos(this.GetGlobalResourceObject("strings", "Todos").ToString(), this.ddlMes);  
        }

        /// <summary>
        /// Obtiene una lista de 10 años a partir del actual.
        /// </summary>
        private void GetAños()
        {
            this.ddlAño.DataSource = this.comunesNegocio.GetAños();
            this.ddlAño.DataBind();
            this.comunesNegocio.SetTodos(this.GetGlobalResourceObject("strings", "Todos").ToString(), this.ddlAño);  
        }

        /// <summary>
        /// Obtiene los tipos de procesos relacionados con las cargas, recargas de archivos y con las ejecuciones y reejecuciones de proyectos.
        /// </summary>
        private void GetTipoProceso()
        {
            this.ddlTipoProceso.DataSource = this.consultaCargasEjecucionNegocio.GetTipoProceso();
            this.ddlTipoProceso.DataBind();
            this.comunesNegocio.SetTodos(this.GetGlobalResourceObject("strings", "Todos").ToString(), this.ddlTipoProceso);
        }

        /// <summary>
        /// Búsqueda principal. Obtiene los archivos cargados y recargados, asi como los proyectos ejecutados y reejecutados.
        /// </summary>
        public void Search()
        {
            List<ConsultaCargaEjecucionInfo> listCargasArchivos;
            listCargasArchivos = this.consultaCargasEjecucionNegocio.GetCargasArchivos(this.ConsultaCargaFilters);
            listCargasArchivos.AddRange(this.consultaCargasEjecucionNegocio.GetEjecucionProyectos(this.ConsultaCargaFilters));
            this.DataSourceEjecucion = listCargasArchivos;
            this.grdProcesos.DataSource = this.DataSourceEjecucion;
            this.grdProcesos.DataBind();
        }

        /// <summary>
        /// Obtiene los filtros.
        /// </summary>
        private void GetFilters()
        {
            this.ConsultaCargaFilters.IdProyecto = ddlProyecto.SelectedValue == this.comunesNegocio.ValorTodos ? this.ConsultaCargaFilters.IdProyecto = null : int.Parse(ddlProyecto.SelectedValue);
            this.ConsultaCargaFilters.IdArchivo = ddlArchivo.SelectedValue == this.comunesNegocio.ValorTodos ? this.ConsultaCargaFilters.IdArchivo = null : int.Parse(ddlArchivo.SelectedValue);
            this.ConsultaCargaFilters.IdUsuario = ddlUsuario.SelectedValue == this.comunesNegocio.ValorTodos ? this.ConsultaCargaFilters.IdUsuario = null : int.Parse(ddlUsuario.SelectedValue);
            this.ConsultaCargaFilters.Año = ddlAño.SelectedValue == this.comunesNegocio.ValorTodos ? this.ConsultaCargaFilters.Año = null : int.Parse(ddlAño.SelectedValue);
            this.ConsultaCargaFilters.Mes = ddlMes.SelectedValue == this.comunesNegocio.ValorTodos ? this.ConsultaCargaFilters.Mes = null : int.Parse(ddlMes.SelectedValue);
            this.ConsultaCargaFilters.IdTipoProceso = ddlTipoProceso.SelectedValue == this.comunesNegocio.ValorTodos ? this.ConsultaCargaFilters.IdTipoProceso = null : int.Parse(ddlTipoProceso.SelectedValue);
        }

        #endregion
    }
}